No missing data. Check data types of each variable:
We will definitely need to change the data type for the date column, and potentially look into creating factors for some of the more ordinal variables.
Part 2: EDA
library(Hmisc)
Loading required package: lattice
Loading required package: survival
Loading required package: Formula
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: ‘Hmisc’
The following objects are masked from ‘package:dplyr’:
src, summarize
The following objects are masked from ‘package:base’:
format.pval, units
library(Hmisc)
library(tidyverse)
library(dplyr)
library(faraway)
Attaching package: ‘faraway’
The following objects are masked from ‘package:survival’:
rats, solder
The following object is masked from ‘package:lattice’:
melanoma
library(Hmisc)
library(tidyverse)
library(dplyr)
library(faraway)
library(gridExtra)
Attaching package: ‘gridExtra’
The following object is masked from ‘package:dplyr’:
combine
names(house)
[1] "id" "date" "price" "bedrooms" "bathrooms" "sqft_living" "sqft_lot"
[8] "floors" "waterfront" "view" "condition" "grade" "sqft_above" "sqft_basement"
[15] "yr_built" "yr_renovated" "zipcode" "lat" "long" "sqft_living15" "sqft_lot15"
[22] "num"
Prior to dropping Date and Geotags consider using them for plotting, for example transaction counts by dates?
names(house)
[1] "price" "bedrooms" "bathrooms" "sqft_living" "sqft_lot" "floors" "waterfront"
[8] "view" "condition" "grade" "sqft_above" "sqft_basement" "yr_built" "yr_renovated"
[15] "sqft_living15" "sqft_lot15"
describe(house)
house
16 Variables 21613 Observations
-----------------------------------------------------------------------------------------------------------------------------
price
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 3625 1 540182 329562 210000 245000 321950 450000 645000 887000 1160000
lowest : 75000 78000 80000 81000 82000, highest: 5350000 5570000 6890000 7060000 7700000
-----------------------------------------------------------------------------------------------------------------------------
bedrooms
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 13 0.871 3.371 0.946 2 2 3 3 4 4 5
lowest : 0 1 2 3 4, highest: 8 9 10 11 33
Value 0 1 2 3 4 5 6 7 8 9 10 11 33
Frequency 13 199 2760 9824 6882 1601 272 38 13 6 3 1 1
Proportion 0.001 0.009 0.128 0.455 0.318 0.074 0.013 0.002 0.001 0.000 0.000 0.000 0.000
-----------------------------------------------------------------------------------------------------------------------------
bathrooms
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 30 0.974 2.115 0.8444 1.00 1.00 1.75 2.25 2.50 3.00 3.50
lowest : 0.00 0.50 0.75 1.00 1.25, highest: 6.50 6.75 7.50 7.75 8.00
-----------------------------------------------------------------------------------------------------------------------------
sqft_living
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 1038 1 2080 978.4 940 1090 1427 1910 2550 3250 3760
lowest : 290 370 380 384 390, highest: 9640 9890 10040 12050 13540
-----------------------------------------------------------------------------------------------------------------------------
sqft_lot
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 9782 1 15107 17855 1800 3322 5040 7618 10688 21398 43339
lowest : 520 572 600 609 635, highest: 982998 1024068 1074218 1164794 1651359
-----------------------------------------------------------------------------------------------------------------------------
floors
n missing distinct Info Mean Gmd
21613 0 6 0.823 1.494 0.5563
lowest : 1.0 1.5 2.0 2.5 3.0, highest: 1.5 2.0 2.5 3.0 3.5
Value 1.0 1.5 2.0 2.5 3.0 3.5
Frequency 10680 1910 8241 161 613 8
Proportion 0.494 0.088 0.381 0.007 0.028 0.000
-----------------------------------------------------------------------------------------------------------------------------
waterfront
n missing distinct
21613 0 2
Value 0 1
Frequency 21450 163
Proportion 0.992 0.008
-----------------------------------------------------------------------------------------------------------------------------
view
n missing distinct
21613 0 5
lowest : 0 1 2 3 4, highest: 0 1 2 3 4
Value 0 1 2 3 4
Frequency 19489 332 963 510 319
Proportion 0.902 0.015 0.045 0.024 0.015
-----------------------------------------------------------------------------------------------------------------------------
condition
n missing distinct
21613 0 5
lowest : 1 2 3 4 5, highest: 1 2 3 4 5
Value 1 2 3 4 5
Frequency 30 172 14031 5679 1701
Proportion 0.001 0.008 0.649 0.263 0.079
-----------------------------------------------------------------------------------------------------------------------------
grade
n missing distinct
21613 0 12
lowest : 1 3 4 5 6 , highest: 9 10 11 12 13
Value 1 3 4 5 6 7 8 9 10 11 12 13
Frequency 1 3 29 242 2038 8981 6068 2615 1134 399 90 13
Proportion 0.000 0.000 0.001 0.011 0.094 0.416 0.281 0.121 0.052 0.018 0.004 0.001
-----------------------------------------------------------------------------------------------------------------------------
sqft_above
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 946 1 1788 876.2 850 970 1190 1560 2210 2950 3400
lowest : 290 370 380 384 390, highest: 7880 8020 8570 8860 9410
-----------------------------------------------------------------------------------------------------------------------------
sqft_basement
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 306 0.776 291.5 422.2 0 0 0 0 560 970 1190
lowest : 0 10 20 40 50, highest: 3260 3480 3500 4130 4820
-----------------------------------------------------------------------------------------------------------------------------
yr_built
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 116 1 1971 33.38 1915 1926 1951 1975 1997 2007 2011
lowest : 1900 1901 1902 1903 1904, highest: 2011 2012 2013 2014 2015
-----------------------------------------------------------------------------------------------------------------------------
yr_renovated
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 70 0.122 84.4 161.7 0 0 0 0 0 0 0
lowest : 0 1934 1940 1944 1945, highest: 2011 2012 2013 2014 2015
Value 0 1935 1940 1945 1950 1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015
Frequency 20699 1 2 6 4 13 12 16 27 25 43 88 99 84 112 156 82 144
Proportion 0.958 0.000 0.000 0.000 0.000 0.001 0.001 0.001 0.001 0.001 0.002 0.004 0.005 0.004 0.005 0.007 0.004 0.007
For the frequency table, variable is rounded to the nearest 5
-----------------------------------------------------------------------------------------------------------------------------
sqft_living15
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 777 1 1987 743.2 1140 1256 1490 1840 2360 2930 3300
lowest : 399 460 620 670 690, highest: 5600 5610 5790 6110 6210
-----------------------------------------------------------------------------------------------------------------------------
sqft_lot15
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
21613 0 8689 1 12768 13404 1999 3667 5100 7620 10083 17852 37063
lowest : 651 659 660 748 750, highest: 434728 438213 560617 858132 871200
-----------------------------------------------------------------------------------------------------------------------------
ggplot(house, aes(x=sqft_living, y=price, color=waterfront))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with waterfornt indicator")
`geom_smooth()` using formula 'y ~ x'

ggplot(house, aes(x=sqft_living, y=price, color=view))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with view indicator")
`geom_smooth()` using formula 'y ~ x'

ggplot(house, aes(x=sqft_living, y=price, color=condition))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with condition indicator")
`geom_smooth()` using formula 'y ~ x'

ggplot(house, aes(x=sqft_living, y=price, color=grade))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with grade indicator")
`geom_smooth()` using formula 'y ~ x'

Question: how to deal with indicator (ordinary) varibales in this case?






# Changing `view` to 0 for regular view and 1 for every other view
house$view <- asfactor(ifelse(house$view!=0, 1, 0))
Error in asfactor(ifelse(house$view != 0, 1, 0)) :
could not find function "asfactor"

Checking possible interactions after mapping categorical variables to a larger classes
ggplot(house, aes(x=sqft_living, y=price, color=view))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with view indicator")
`geom_smooth()` using formula 'y ~ x'

ggplot(house, aes(x=sqft_living, y=price, color=condition))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with condition indicator")
`geom_smooth()` using formula 'y ~ x'

ggplot(house, aes(x=sqft_living, y=price, color=grade))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with grade indicator")
`geom_smooth()` using formula 'y ~ x'

Converting quantitative predictor floors to a factor 1, 2, 3.
house$floors <- ifelse(house$floors < 2, 1, iflese(house$floors < 3, 2, eflse(>=3, 3, 0)))
Error: unexpected '>=' in "house$floors <- ifelse(house$floors < 2, 1, iflese(house$floors < 3, 2, eflse(>="
ggplot(house, aes(x=sqft_living, y=price, color=floors))+
geom_point()+
geom_smooth(method = "lm", se=FALSE)+
labs(x="sqft_living",
y="price",
title="Scatter plot of price against sqft_living with floors indicator")
`geom_smooth()` using formula 'y ~ x'

Computing age of the house
unique((house$bathrooms))
[1] 1.00 2.25 3.00 2.00 4.50 1.50 2.50 1.75 2.75 3.25 4.00 3.50 0.75 4.75 5.00 4.25 3.75 0.00 1.25 5.25 6.00 0.50 5.50 6.75
[25] 5.75 8.00 7.50 7.75 6.25 6.50
names(house)
[1] "price" "bedrooms" "bathrooms" "sqft_living" "sqft_lot" "floors" "waterfront"
[8] "view" "condition" "grade" "sqft_above" "sqft_basement" "sqft_living15" "sqft_lot15"
[15] "age"
Other stuff
dp1<-ggplot(house, aes(x=sqft_living, color=waterfront))+
geom_density()+
labs(title="Sqft_living by waterfront")
dp2<-ggplot(house,aes(x=sqft_lot, color=waterfront))+
geom_density()+
labs(title="Sqft_lot by waterfront")
dp3<-ggplot(house,aes(x=sqft_above, color=waterfront))+
geom_density()+
labs(title="Sqft_above by waterfront")
dp4<-ggplot(house,aes(x=sqft_basement, color=waterfront))+
geom_density()+
labs(title="Sqft_basement by waterfront")
dp5<-ggplot(house,aes(x=sqft_living15, color=waterfront))+
geom_density()+
labs(title="Sqft_living15 by waterfront")
dp6<-ggplot(house,aes(x=sqft_lot15, color=waterfront))+
geom_density()+
labs(title="Sqft_lot15 by waterfront")
##produce the 4 density plots in a 2 by 2 matrix
grid.arrange(dp1, dp2, dp3, dp4, dp5, dp6, ncol = 2, nrow = 3)
dp1<-ggplot(house, aes(x=yr_built, color=waterfront))+
geom_density()+
labs(title="Yr_built by waterfront")
dp2<-ggplot(house,aes(x=yr_renovated, color=waterfront))+
geom_density()+
labs(title="Yr_renovated by waterfront")
dp3<-ggplot(house,aes(x=floors, color=waterfront))+
geom_density()+
labs(title="Floors by waterfront")
dp4<-ggplot(house,aes(x=bedrooms, color=waterfront))+
geom_density()+
labs(title="Bedrooms by waterfront")
dp5<-ggplot(house,aes(x=bathrooms, color=waterfront))+
geom_density()+
labs(title="Bathrooms by waterfront")
dp6<-ggplot(house,aes(x=grade, color=waterfront))+
geom_density()+
labs(title="Grade by waterfront")
##produce the 4 density plots in a 2 by 2 matrix
grid.arrange(dp1, dp2, dp3, dp4, dp5, dp6, ncol = 2, nrow = 3)
corr <- round(cor(house[,c("price",quant_vars)]), 1)
Error in `[.data.frame`(house, , c("price", quant_vars)) :
undefined columns selected
LS0tCnRpdGxlOiAnU1RBVCA2MDIxOiBQcm9qZWN0IDInCmF1dGhvcjogIkNvbm5pZSBDdWkiCmRhdGU6ICIxMS8yNi8yMDIxIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgoKTG9hZCBpbiBwYWNrYWdlcwpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKYGBgCmltcG9ydCBkYXRhOgpgYGB7cn0KaG91c2UgPC0gcmVhZC5jc3YoImhvdXNlX2RhdGEuY3N2IikKaGVhZChob3VzZSkKYGBgCmZpbmQgbWlzc2luZyBkYXRhOgpgYGB7cn0KIyBsaXN0IHJvd3Mgb2YgZGF0YSB0aGF0IGhhdmUgbWlzc2luZyB2YWx1ZXMKaG91c2VbIWNvbXBsZXRlLmNhc2VzKGhvdXNlKSxdCmBgYApObyBtaXNzaW5nIGRhdGEuCkNoZWNrIGRhdGEgdHlwZXMgb2YgZWFjaCB2YXJpYWJsZToKYGBge3J9CnN0cihob3VzZSkKYGBgCldlIHdpbGwgZGVmaW5pdGVseSBuZWVkIHRvIGNoYW5nZSB0aGUgZGF0YSB0eXBlIGZvciB0aGUgZGF0ZSBjb2x1bW4sIGFuZCBwb3RlbnRpYWxseSBsb29rIGludG8gY3JlYXRpbmcgZmFjdG9ycyBmb3Igc29tZSBvZiB0aGUgbW9yZSBvcmRpbmFsIHZhcmlhYmxlcy4KYGBge3J9CmhvdXNlJGRhdGUgPSBzdWJzdHIoaG91c2UkZGF0ZSwxLG5jaGFyKGhvdXNlJGRhdGUpLTcpCmhlYWQoaG91c2UpCmBgYApDb252ZXJ0IGRhdGUgdmFyaWFiZSB0byBkYXRlIHR5cGU6CmBgYHtyfQpob3VzZSRkYXRlIDwtIGFzLkRhdGUoaG91c2UkZGF0ZSwgIiVZJW0lZCIpCmhlYWQoaG91c2UpCmBgYApUdXJuaW5nIHZpZXcsIGNvbmRpdGlvbiwgYW5kIGdyYWRlIGludG8gb3JkZXJlZCBmYWN0b3JzOgpgYGB7cn0KaG91c2UkdmlldyA8LSBmYWN0b3IoaG91c2Ukdmlldywgb3JkZXJlZCA9IFRSVUUsIGxldmVscyA9IGMoMCwgMSwgMiwgMywgNCkpCmhvdXNlJGNvbmRpdGlvbiA8LSBmYWN0b3IoaG91c2UkY29uZGl0aW9uLCBvcmRlcmVkID0gVFJVRSwgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSkKaG91c2UkZ3JhZGUgPC0gZmFjdG9yKGhvdXNlJGdyYWRlLCBvcmRlcmVkID0gVFJVRSwgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1KSkKaG91c2Ukd2F0ZXJmcm9udCA8LSBmYWN0b3IoaG91c2Ukd2F0ZXJmcm9udCwgb3JkZXJlZCA9IFRSVUUsIGxldmVscyA9IGMoMCwgMSkpCmBgYAoKCgojIyBQYXJ0IDI6IEVEQQoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJnZ2NvcnJwbG90IikKI2luc3RhbGwucGFja2FnZXMoIm1pc2NzZXQiKQpsaWJyYXJ5KG1pc2NzZXQpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGZhcmF3YXkpCmxpYnJhcnkoZ3JpZEV4dHJhKQpgYGAKCmBgYHtyfQpuYW1lcyhob3VzZSkKYGBgCgojIyMjIFByaW9yIHRvIGRyb3BwaW5nIERhdGUgYW5kIEdlb3RhZ3MgY29uc2lkZXIgdXNpbmcgdGhlbSBmb3IgcGxvdHRpbmcsIGZvciBleGFtcGxlIHRyYW5zYWN0aW9uIGNvdW50cyBieSBkYXRlcz8KCgpgYGB7cn0KaG91c2UgPC0gc3Vic2V0KGhvdXNlLCBzZWxlY3Q9LWMoaWQsbnVtLCBkYXRlLCB6aXBjb2RlLCBsYXQsIGxvbmcpKQpuYW1lcyhob3VzZSkKYGBgCgpgYGB7cn0KZGVzY3JpYmUoaG91c2UpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoaG91c2UsIGFlcyh4PXNxZnRfbGl2aW5nLCB5PXByaWNlLCBjb2xvcj13YXRlcmZyb250KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFKSsKICBsYWJzKHg9InNxZnRfbGl2aW5nIiwgCiAgICAgICB5PSJwcmljZSIsCiAgICAgICB0aXRsZT0iU2NhdHRlciBwbG90IG9mIHByaWNlIGFnYWluc3Qgc3FmdF9saXZpbmcgd2l0aCB3YXRlcmZvcm50IGluZGljYXRvciIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoaG91c2UsIGFlcyh4PXNxZnRfbGl2aW5nLCB5PXByaWNlLCBjb2xvcj12aWV3KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFKSsKICBsYWJzKHg9InNxZnRfbGl2aW5nIiwgCiAgICAgICB5PSJwcmljZSIsCiAgICAgICB0aXRsZT0iU2NhdHRlciBwbG90IG9mIHByaWNlIGFnYWluc3Qgc3FmdF9saXZpbmcgd2l0aCB2aWV3IGluZGljYXRvciIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoaG91c2UsIGFlcyh4PXNxZnRfbGl2aW5nLCB5PXByaWNlLCBjb2xvcj1jb25kaXRpb24pKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RkFMU0UpKwogIGxhYnMoeD0ic3FmdF9saXZpbmciLCAKICAgICAgIHk9InByaWNlIiwKICAgICAgIHRpdGxlPSJTY2F0dGVyIHBsb3Qgb2YgcHJpY2UgYWdhaW5zdCBzcWZ0X2xpdmluZyB3aXRoIGNvbmRpdGlvbiBpbmRpY2F0b3IiKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGhvdXNlLCBhZXMoeD1zcWZ0X2xpdmluZywgeT1wcmljZSwgY29sb3I9Z3JhZGUpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RkFMU0UpKwogIGxhYnMoeD0ic3FmdF9saXZpbmciLCAKICAgICAgIHk9InByaWNlIiwKICAgICAgIHRpdGxlPSJTY2F0dGVyIHBsb3Qgb2YgcHJpY2UgYWdhaW5zdCBzcWZ0X2xpdmluZyB3aXRoIGdyYWRlIGluZGljYXRvciIpCmBgYAoKIyMjIyBRdWVzdGlvbjogaG93IHRvIGRlYWwgd2l0aCBpbmRpY2F0b3IgKG9yZGluYXJ5KSB2YXJpYmFsZXMgaW4gdGhpcyBjYXNlPwoKCmBgYHtyfQpxdWFudF92YXJzID0gYygieXJfYnVpbHQiLCAieXJfcmVub3ZhdGVkIiwKICAgICAgICAgICAgICAgImZsb29ycyIsICJiZWRyb29tcyIsICJiYXRocm9vbXMiLCAKICAgICAgICAgICAgICAgInNxZnRfbGl2aW5nIiwgInNxZnRfbG90IiwgInNxZnRfYWJvdmUiLCAic3FmdF9iYXNlbWVudCIsIAogICAgICAgICAgICAgICAic3FmdF9saXZpbmcxNSIsICJzcWZ0X2xvdDE1IikKCmNhdF92YXJzID0gYygid2F0ZXJmcm9udCIsICJ2aWV3IiwgImNvbmRpdGlvbiIsICJncmFkZSIpCgpsaWJyYXJ5KEhtaXNjKQpoaXN0LmRhdGEuZnJhbWUoaG91c2VbLHF1YW50X3ZhcnNdKQpgYGAKCmBgYHtyfQpnZ3Bsb3RHcmlkKG5jb2wgPSAyLAogIGxhcHBseShjKCJ2aWV3IiwgIndhdGVyZnJvbnQiLCAiY29uZGl0aW9uIiwgImdyYWRlIiksCiAgICBmdW5jdGlvbihjb2wpIHsKICAgICAgICBnZ3Bsb3QoaG91c2UsIGFlc19zdHJpbmcoY29sKSkgKyBnZW9tX2JhcigpICsgY29vcmRfZmxpcCgpCiAgICB9KSkKYGBgCgpgYGB7cn0KZ2dwbG90KGhvdXNlLCBhZXMoeD13YXRlcmZyb250LCB5PXByaWNlKSkrCmdlb21fYm94cGxvdCgpKwpsYWJzKHg9IndhdGVyZnJvbnQiLCB5PSJwcmljZSIsIHRpdGxlPSJQcmljZSBieSB3YXRlcmZyb250IikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KGhvdXNlLCBhZXMoeD12aWV3LCB5PXByaWNlKSkrCmdlb21fYm94cGxvdCgpKwpsYWJzKHg9InZpZXciLCB5PSJwcmljZSIsIHRpdGxlPSJQcmljZSBieSB2aWV3IikKYGBgCgoKYGBge3J9CmdncGxvdChob3VzZSwgYWVzKHg9Y29uZGl0aW9uLCB5PXByaWNlKSkrCmdlb21fYm94cGxvdCgpKwpsYWJzKHg9ImNvbmRpdGlvbiIsIHk9InByaWNlIiwgdGl0bGU9IlByaWNlIGJ5IGNvbmRpdGlvbiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoaG91c2UsIGFlcyh4PWdyYWRlLCB5PXByaWNlKSkrCmdlb21fYm94cGxvdCgpKwpsYWJzKHg9ImdyYWRlIiwgeT0icHJpY2UiLCB0aXRsZT0iUHJpY2UgYnkgZ3JhZGUiKQpgYGAKCgoKYGBge3J9CmhlYWQoaG91c2UpCmBgYAoKYGBge3J9CiMgQ2hhbmdpbmcgYHZpZXdgIHRvIDAgZm9yIHJlZ3VsYXIgdmlldyBhbmQgMSBmb3IgZXZlcnkgb3RoZXIgdmlldwpob3VzZSR2aWV3IDwtIGZhY3RvcihpZmVsc2UoaG91c2UkdmlldyE9MCwgMSwgMCkpCiMgQ2hhbmdpbmcgYGNvbmRpdGlvbmAgdG8gMCBmb3IgZXZlcnl0aGluZyBiZWxvdyAzIGFuZCAxIG90aGVyd2lzZQpob3VzZSRjb25kaXRpb24gPC0gZmFjdG9yKGlmZWxzZShob3VzZSRjb25kaXRpb249PTEgfCBob3VzZSRjb25kaXRpb249PTIgfCBob3VzZSRjb25kaXRpb249PTMsIDAsIDEpKQojIENoYW5naW5nIGBncmFkZWAgdG8gMCBmb3IgZXZlcnl0aGluZyBiZWxvdyA3IGFuZCAxIG90aGVyd2lzZQpob3VzZSRncmFkZSA8LSBmYWN0b3IoaWZlbHNlKGhvdXNlJGdyYWRlPT0xIHwgaG91c2UkZ3JhZGU9PTIgfCBob3VzZSRncmFkZT09MyB8CiAgICAgICAgICAgICAgICAgICAgICBob3VzZSRncmFkZT09NCB8IGhvdXNlJGdyYWRlPT01IHwgaG91c2UkZ3JhZGU9PTcgLCAwLCAxKSkKYGBgCgoKYGBge3J9CmdncGxvdEdyaWQobmNvbCA9IDIsCiAgbGFwcGx5KGMoInZpZXciLCAid2F0ZXJmcm9udCIsICJjb25kaXRpb24iLCAiZ3JhZGUiKSwKICAgIGZ1bmN0aW9uKGNvbCkgewogICAgICAgIGdncGxvdChob3VzZSwgYWVzX3N0cmluZyhjb2wpKSArIGdlb21fYmFyKCkgKyBjb29yZF9mbGlwKCkKICAgIH0pKQpgYGAKCiMjIyMgQ2hlY2tpbmcgcG9zc2libGUgaW50ZXJhY3Rpb25zIGFmdGVyIG1hcHBpbmcgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHRvIGEgbGFyZ2VyIGNsYXNzZXMKCmBgYHtyfQpnZ3Bsb3QoaG91c2UsIGFlcyh4PXNxZnRfbGl2aW5nLCB5PXByaWNlLCBjb2xvcj12aWV3KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFKSsKICBsYWJzKHg9InNxZnRfbGl2aW5nIiwgCiAgICAgICB5PSJwcmljZSIsCiAgICAgICB0aXRsZT0iU2NhdHRlciBwbG90IG9mIHByaWNlIGFnYWluc3Qgc3FmdF9saXZpbmcgd2l0aCB2aWV3IGluZGljYXRvciIpCmBgYApgYGB7cn0KZ2dwbG90KGhvdXNlLCBhZXMoeD1zcWZ0X2xpdmluZywgeT1wcmljZSwgY29sb3I9Y29uZGl0aW9uKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFKSsKICBsYWJzKHg9InNxZnRfbGl2aW5nIiwgCiAgICAgICB5PSJwcmljZSIsCiAgICAgICB0aXRsZT0iU2NhdHRlciBwbG90IG9mIHByaWNlIGFnYWluc3Qgc3FmdF9saXZpbmcgd2l0aCBjb25kaXRpb24gaW5kaWNhdG9yIikKYGBgCgoKYGBge3J9CmdncGxvdChob3VzZSwgYWVzKHg9c3FmdF9saXZpbmcsIHk9cHJpY2UsIGNvbG9yPWdyYWRlKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFKSsKICBsYWJzKHg9InNxZnRfbGl2aW5nIiwgCiAgICAgICB5PSJwcmljZSIsCiAgICAgICB0aXRsZT0iU2NhdHRlciBwbG90IG9mIHByaWNlIGFnYWluc3Qgc3FmdF9saXZpbmcgd2l0aCBncmFkZSBpbmRpY2F0b3IiKQpgYGAKCgoKIyMjIyBDb252ZXJ0aW5nIHF1YW50aXRhdGl2ZSBwcmVkaWN0b3IgZmxvb3JzIHRvIGEgZmFjdG9yIDEsIDIsIDMuCgoKYGBge3J9CmhvdXNlJGZsb29ycyA8LSBmYWN0b3IoaWZlbHNlKGhvdXNlJGZsb29ycyA8IDIsIDEsIGlmZWxzZShob3VzZSRmbG9vcnMgPCAzLCAyLCBpZmVsc2UoaG91c2UkZmxvb3JzPj0zLCAzLCAwKSkpKQpgYGAKCgoKYGBge3J9CmdncGxvdChob3VzZSwgYWVzKHg9c3FmdF9saXZpbmcsIHk9cHJpY2UsIGNvbG9yPWZsb29ycykpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZT1GQUxTRSkrCiAgbGFicyh4PSJzcWZ0X2xpdmluZyIsIAogICAgICAgeT0icHJpY2UiLAogICAgICAgdGl0bGU9IlNjYXR0ZXIgcGxvdCBvZiBwcmljZSBhZ2FpbnN0IHNxZnRfbGl2aW5nIHdpdGggZmxvb3JzIGluZGljYXRvciIpCmBgYAoKCiMjIyMgQ29tcHV0aW5nIGFnZSBvZiB0aGUgaG91c2UKCmBgYHtyfQpob3VzZSRhZ2UgPSBpZmVsc2UoMjAyMS1ob3VzZSR5cl9yZW5vdmF0ZWQgPj0gMjAyMS1ob3VzZSR5cl9idWlsdCwgMjAyMS1ob3VzZSR5cl9idWlsdCwgMjAyMS1ob3VzZSR5cl9yZW5vdmF0ZWQpCmhlYWQoaG91c2UpCmBgYAoKYGBge3J9Cmhpc3QoaG91c2UkYmF0aHJvb21zKQp1bmlxdWUoKGhvdXNlJGJhdGhyb29tcykpCmBgYAoKYGBge3J9CmhvdXNlIDwtIHN1YnNldChob3VzZSwgc2VsZWN0PS1jKHlyX3Jlbm92YXRlZCwgeXJfYnVpbHQpKQpuYW1lcyhob3VzZSkKYGBgCgoKIyMjIyBPdGhlciBzdHVmZiAKCgpgYGB7cn0KZHAxPC1nZ3Bsb3QoaG91c2UsIGFlcyh4PXNxZnRfbGl2aW5nLCBjb2xvcj13YXRlcmZyb250KSkrCmdlb21fZGVuc2l0eSgpKwpsYWJzKHRpdGxlPSJTcWZ0X2xpdmluZyBieSB3YXRlcmZyb250IikKCgpkcDI8LWdncGxvdChob3VzZSxhZXMoeD1zcWZ0X2xvdCwgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iU3FmdF9sb3QgYnkgd2F0ZXJmcm9udCIpCgoKZHAzPC1nZ3Bsb3QoaG91c2UsYWVzKHg9c3FmdF9hYm92ZSwgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iU3FmdF9hYm92ZSBieSB3YXRlcmZyb250IikKCgpkcDQ8LWdncGxvdChob3VzZSxhZXMoeD1zcWZ0X2Jhc2VtZW50LCBjb2xvcj13YXRlcmZyb250KSkrCmdlb21fZGVuc2l0eSgpKwpsYWJzKHRpdGxlPSJTcWZ0X2Jhc2VtZW50IGJ5IHdhdGVyZnJvbnQiKQoKZHA1PC1nZ3Bsb3QoaG91c2UsYWVzKHg9c3FmdF9saXZpbmcxNSwgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iU3FmdF9saXZpbmcxNSBieSB3YXRlcmZyb250IikKCgpkcDY8LWdncGxvdChob3VzZSxhZXMoeD1zcWZ0X2xvdDE1LCBjb2xvcj13YXRlcmZyb250KSkrCmdlb21fZGVuc2l0eSgpKwpsYWJzKHRpdGxlPSJTcWZ0X2xvdDE1IGJ5IHdhdGVyZnJvbnQiKQoKCiMjcHJvZHVjZSB0aGUgNCBkZW5zaXR5IHBsb3RzIGluIGEgMiBieSAyIG1hdHJpeApncmlkLmFycmFuZ2UoZHAxLCBkcDIsIGRwMywgZHA0LCBkcDUsIGRwNiwgbmNvbCA9IDIsIG5yb3cgPSAzKQpgYGAKCiAgICAgICAgICAgICAgIAoKCmBgYHtyfQpkcDE8LWdncGxvdChob3VzZSwgYWVzKHg9eXJfYnVpbHQsIGNvbG9yPXdhdGVyZnJvbnQpKSsKZ2VvbV9kZW5zaXR5KCkrCmxhYnModGl0bGU9IllyX2J1aWx0IGJ5IHdhdGVyZnJvbnQiKQoKCmRwMjwtZ2dwbG90KGhvdXNlLGFlcyh4PXlyX3Jlbm92YXRlZCwgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iWXJfcmVub3ZhdGVkIGJ5IHdhdGVyZnJvbnQiKQoKCmRwMzwtZ2dwbG90KGhvdXNlLGFlcyh4PWZsb29ycywgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iRmxvb3JzIGJ5IHdhdGVyZnJvbnQiKQoKCmRwNDwtZ2dwbG90KGhvdXNlLGFlcyh4PWJlZHJvb21zLCBjb2xvcj13YXRlcmZyb250KSkrCmdlb21fZGVuc2l0eSgpKwpsYWJzKHRpdGxlPSJCZWRyb29tcyBieSB3YXRlcmZyb250IikKCmRwNTwtZ2dwbG90KGhvdXNlLGFlcyh4PWJhdGhyb29tcywgY29sb3I9d2F0ZXJmcm9udCkpKwpnZW9tX2RlbnNpdHkoKSsKbGFicyh0aXRsZT0iQmF0aHJvb21zIGJ5IHdhdGVyZnJvbnQiKQoKCmRwNjwtZ2dwbG90KGhvdXNlLGFlcyh4PWdyYWRlLCBjb2xvcj13YXRlcmZyb250KSkrCmdlb21fZGVuc2l0eSgpKwpsYWJzKHRpdGxlPSJHcmFkZSBieSB3YXRlcmZyb250IikKCgojI3Byb2R1Y2UgdGhlIDQgZGVuc2l0eSBwbG90cyBpbiBhIDIgYnkgMiBtYXRyaXgKZ3JpZC5hcnJhbmdlKGRwMSwgZHAyLCBkcDMsIGRwNCwgZHA1LCBkcDYsIG5jb2wgPSAyLCBucm93ID0gMykKYGBgCgoKYGBge3J9CmNvcnIgPC0gcm91bmQoY29yKGhvdXNlWyxjKCJwcmljZSIscXVhbnRfdmFycyldKSwgMSkKI2hlYWQoY29yclssIDE6Nl0pCmxpYnJhcnkoZ2djb3JycGxvdCkKZ2djb3JycGxvdChjb3JyLCAKICAgICAgICAgICBtZXRob2QgPSAiY2lyY2xlIiwgCiAgICAgICAgICAgbGFiID0gVFJVRSwKICAgICAgICAgICB0eXBlID0gImxvd2VyIiwgCiAgICAgICAgICAgb3V0bGluZS5jb2xvciA9ICJ3aGl0ZSIsIAogICAgICAgICAgIGdndGhlbWUgPSBnZ3Bsb3QyOjp0aGVtZV9ncmF5LAogICAgICAgICAgIGNvbG9ycyA9IGMoIiM2RDlFQzEiLCAid2hpdGUiLCAiI0U0NjcyNiIpKQpgYGAKCgoKCgojIyBUT0RPOiBpbnRlcnByZXRpbmcgbW9kZWxzIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9qdG9vbHMvdmlnbmV0dGVzL3N1bW0uaHRtbAoKYGBge3J9CmZpdCA8LSBsbShwcmljZSB+IC4gLSBzcWZ0X2Jhc2VtZW50LCBkYXRhID0gaG91c2UpCnN1bW1hcnkoZml0KQpgYGAKCmBgYHtyfQpwbG90KGZpdCkKYGBgCgoKCgoKYGBge3J9CgpyZWR1Y2VkIDwtIGxtKGxvZyhwcmljZSkgfiBzcWZ0X2xpdmluZytiZWRyb29tcytiYXRocm9vbXMrZmxvb3JzK3dhdGVyZnJvbnQrYWdlK3NxZnRfbGl2aW5nMTUrc3FmdF9sb3QxNSwgCiAgICAgICAgICAgICAgZGF0YSA9IGhvdXNlKQpzdW1tYXJ5KHJlZHVjZWQpCmBgYAoKCmBgYHtyfQpwbG90KHJlZHVjZWQpCmBgYAoKCgpgYGB7cn0KdGlueSA8LSBsbShwcmljZSB+IHNxZnRfbGl2aW5nMTUrYmF0aHJvb21zK3dhdGVyZnJvbnQsIAogICAgICAgICAgICAgIGRhdGEgPSBob3VzZSkKc3VtbWFyeSh0aW55KQpgYGAKCgoKYGBge3J9CnBsb3QodGlueSkKYGBgCgoKCmBgYHtyfQpwbG90KGhvdXNlJHByaWNlLCBob3VzZSRzcWZ0X2xpdmluZykKYGBgCgpgYGB7cn0KcGxvdChob3VzZSRwcmljZSwgaG91c2UkYmF0aHJvb21zKQpgYGAKCgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInBsb3RseSIpCmBgYAoKCgoKYGBge3J9CgpsaWJyYXJ5KHBsb3RseSkKZmlnID0gbGlzdCgKICBkYXRhID0gbGlzdCgKICAgIGxpc3QoCiAgICAgIHggPSBob3VzZSRmbG9vcnMsCiAgICAgIHkgPSBob3VzZSRiZWRyb29tcywKICAgICAgdHlwZSA9ICdiYXInCiAgICApCiAgKSwKICBsYXlvdXQgPSBsaXN0KAogICAgdGl0bGUgPSAnQSBGaWd1cmUgU3BlY2lmaWVkIEJ5IFIgTGlzdCcsCiAgICBwbG90X2JnY29sb3I9JyNlNWVjZjYnLCAKICAgICAgICAgeGF4aXMgPSBsaXN0KCAKICAgICAgICAgICB6ZXJvbGluZWNvbG9yID0gJyNmZmZmJywgCiAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIAogICAgICAgICAgIGdyaWRjb2xvciA9ICdmZmZmJyksIAogICAgICAgICB5YXhpcyA9IGxpc3QoIAogICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnI2ZmZmYnLCAKICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMiwgCiAgICAgICAgICAgZ3JpZGNvbG9yID0gJ2ZmZmYnKQogICkKKQojIFRvIGRpc3BsYXkgdGhlIGZpZ3VyZSBkZWZpbmVkIGJ5IHRoaXMgbGlzdCwgdXNlIHRoZSBwbG90bHlfYnVpbGQgZnVuY3Rpb24KcGxvdGx5X2J1aWxkKGZpZykKYGBgCgoKCgo=